/**
 * 一、面向对象的三大特征
 * 1、封装
 * 2、继承
 * 3、多态
 * 二、封装
 * 1、为什么要封装
 * 2、什么是封装：所谓的封装是指我们需要私有化类属性，外界不能直接更改类种的属性的值
 * 3、怎么进行封装，如果封装要进行如下的三步
 *   1）使用private关键字来修饰类中的属性，如果被private修饰的属性就只能类中的成员方法
 *   2) 为每个私有的成员提供set和get存取器
 *   3) 在set或者get方法中完成逻辑判断
 * 4、封装的好处
 *  最大程度限制了外界对程序内部的成员进行随意的更改，限制外部对内部的直接访问，增强了程序的安全性和可维护性
 */
class Person{
    private _name:string|undefined
    private _age:number|undefined
    set name(_name:string){
        this._name=_name
    }
    get name():string|undefined{
        return this._name
    }
    set age(_age:number|undefined){
        if((_age as number)<0){ //使用了断言进行操作
            throw new Error('年龄不能小于0岁')
        }else{
            this._age=_age
        }
       
    }
    get age():number|undefined{
        return this._age
    }
    show(){
        return `我叫${this._name}，今年${this._age}岁`
    }
}
//实例化对象
let p=new Person()
p.name="张三"
try {
    p.age=-20
} catch (error) {
    p.age=0
}

console.log(p.show());


/**
 * 编写一个人类，属性有三个
 * 1、姓名：姓名只能是汉字，至少两个汉字最多不超过4个汉字
 * 2、年龄：年龄不能超过120岁，不能小于0岁
 * 3、性别：只能是男或者是女
 * 技能点：
 * 1、属性私有化set和get存取器
 * 2、异常处理的相关内容
 * 3、正则表达式
 */
